/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package controlador;

import dao.CompromissoJpaController;
import dao.UsuarioJpaController;
import dao.exceptions.NonexistentEntityException;
import dominio.CompromissoMd;
import dominio.UsuarioMd;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import util.Controlador;
import util.IntranetUtil;
import util.NivelAcesso;
import util.Resposta;
import util.Seguranca;

/**
 *
 * @author devair
 */
public class CompromissoCt extends Controlador {

    private CompromissoJpaController dao;
    private UsuarioJpaController daoUsuario;
    
    public CompromissoCt(HttpServletRequest request, HttpServletResponse response, ServletContext contexto) {
        super(request, response, contexto);
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("intranetJPU");        
        dao = new CompromissoJpaController(emf);
        daoUsuario=new UsuarioJpaController(emf);
    }

    @Seguranca(nivel = {NivelAcesso.ADMINISTRADOR,NivelAcesso.USUARIO})
    public void jsonevento() {
        UsuarioMd usuario = (UsuarioMd) this.getRequest().getSession().getAttribute("usuario");        
        List<CompromissoMd> compromissos;
        // dao.findCompromissoEntities();
        compromissos = usuario.getCompromissos();
        this.resposta.adicionarAtributo("compromissos", compromissos, Resposta.EscopoAtributo.requisicao);
        this.resposta.definirResposta("visao/json-evento.jsp", Resposta.TipoResposta.encaminhamento);
    }
    
    @Seguranca(nivel = {NivelAcesso.ADMINISTRADOR,NivelAcesso.USUARIO})
    public void visualiza(){
    
       if (this.getParameterValue("id") != null) {
            CompromissoMd compromisso = dao.findCompromisso(Long.parseLong(this.getParameterValue("id")));
            this.resposta.adicionarAtributo("compromisso", compromisso, Resposta.EscopoAtributo.requisicao);
            this.resposta.adicionarAtributo("id", compromisso.getId(), Resposta.EscopoAtributo.requisicao);
            this.resposta.definirResposta("visao/compromissoVisualiza.jsp", Resposta.TipoResposta.encaminhamento);
        } else {
            this.resposta.definirResposta("visao/naoautorizado.html", Resposta.TipoResposta.encaminhamento);
        }
    }

    @Seguranca(nivel = {NivelAcesso.ADMINISTRADOR,NivelAcesso.USUARIO})
    public void agenda() {
       // List<CompromissoMd> compromissos;
        // compromissos = dao.findCompromissoEntities();

        //this.resposta.adicionarAtributo("compromissos", compromissos, Resposta.EscopoAtributo.requisicao);
        this.resposta.definirResposta("visao/agendames.jsp", Resposta.TipoResposta.encaminhamento);
    }

    @Seguranca(nivel = {NivelAcesso.ADMINISTRADOR,NivelAcesso.USUARIO})
    public void confirmar() {
        CompromissoMd compromisso;
        boolean edicao = false;
        if (this.getParameterValue("id") != null) {
            //edicao
            edicao = true;
            compromisso = dao.findCompromisso(Long.parseLong(this.getParameterValue("id")));
        } else {
            //novo
            compromisso = new CompromissoMd();
        }

        compromisso.setAssunto(this.getParameterValue("assunto").toUpperCase());
        compromisso.setLocalCompromisso(this.getParameterValue("local").toUpperCase());

        Date dataInicio = IntranetUtil.dataTempo(this.getParameterValue("dataInicio"));
        compromisso.setDataInicio(dataInicio);
        Date dataTermino = IntranetUtil.dataTempo(this.getParameterValue("dataTermino"));
        compromisso.setDataTermino(dataTermino);
        compromisso.setDescricao(this.getParameterValue("descricao"));

        String []listaConvidados;
        listaConvidados = this.getParameterValues("listaconvidados");
        //listaConvidados = this.getParameterValues("convidados");
        
        UsuarioMd usuario = (UsuarioMd) getRequest().getSession().getAttribute("usuario");  
        
        List<UsuarioMd> listaConvMd = new ArrayList<UsuarioMd>();
        
        if (listaConvidados!=null){
            for (String c: listaConvidados) {

                UsuarioMd convidado = daoUsuario.findUsuario(Long.parseLong(c));
                if (!edicao){            

                    compromisso.getUsuarios().add(convidado);

                }else{

                    listaConvMd.add(convidado);

                }
            }
            
        }        
                                    
        if (edicao){
            compromisso.setUsuarios(listaConvMd);                    
            usuario.getCompromissos().clear();                            
        }        

        compromisso.getUsuarios().add(usuario);  
        usuario.getCompromissos().add(compromisso);
        
       

        if (edicao) {
            try {
                if (this.resposta.existeErro()) {
                    throw new Exception("Corrigir os erros");
                }
                dao.edit(compromisso);
                this.resposta.definirResposta("agenda", Resposta.TipoResposta.redirecionamento);
            } catch (Exception ex) {
                this.resposta.adicionarErro("geral", "Erro: " + ex.getMessage());
                //this.resposta.adicionarAtributo("grupousuario", compromisso, Resposta.EscopoAtributo.requisicao);
                this.resposta.adicionarAtributo("id", this.getParameterValue("id"), Resposta.EscopoAtributo.requisicao);
                this.resposta.definirResposta("visao/compromissoCadastro.jsp", Resposta.TipoResposta.encaminhamento);
            }
        } else {
            try {
                if (this.resposta.existeErro()) {
                    throw new Exception("Corrigir os erros");
                }                
                dao.create(compromisso);
                this.resposta.definirResposta("agenda", Resposta.TipoResposta.redirecionamento);
            } catch (Exception ex) {
                this.resposta.adicionarErro("geral", "Erro: " + ex.getMessage());
                //this.resposta.adicionarAtributo("grupousuario", compromisso, Resposta.EscopoAtributo.requisicao);
                this.resposta.definirResposta("visao/compromissoCadastro.jsp", Resposta.TipoResposta.encaminhamento);

            }
        }
    }

    @Seguranca(nivel = {NivelAcesso.ADMINISTRADOR,NivelAcesso.USUARIO})
    public void editar() {
        if (this.getParameterValue("id") != null) {
            CompromissoMd compromisso = dao.findCompromisso(Long.parseLong(this.getParameterValue("id")));
            this.resposta.adicionarAtributo("compromisso", compromisso, Resposta.EscopoAtributo.requisicao);
            this.resposta.adicionarAtributo("id", compromisso.getId(), Resposta.EscopoAtributo.requisicao);
             List<UsuarioMd> usuarios = daoUsuario.findUsuarioEntities();
            this.resposta.adicionarAtributo("usuarios", usuarios, Resposta.EscopoAtributo.requisicao);  
            this.resposta.adicionarAtributo("listaconvidados", new ArrayList<String>(), Resposta.EscopoAtributo.requisicao);
            this.resposta.definirResposta("visao/compromissoCadastro.jsp", Resposta.TipoResposta.encaminhamento);
        } else {
            this.resposta.definirResposta("visao/naoautorizado.html", Resposta.TipoResposta.encaminhamento);
        }
    }
    public void excluir() {
        Long id = Long.parseLong(this.getParameterValue("id"));
        try {
                                               
            UsuarioMd usuario = (UsuarioMd) getRequest().getSession().getAttribute("usuario");             
                                    
            boolean achou=false;
            int index = 0;
            int posachou=0;
            while((index<usuario.getCompromissos().size())&&(!achou)){
                
                if(usuario.getCompromissos().get(index).getId()==id ){
                    achou=true;
                    posachou=index;
                }
                    index++;
            }                                               
            
            usuario.getCompromissos().remove(posachou);
                                                        
            dao.destroy(id);       
           
                    
        } catch (NonexistentEntityException ex) {
            System.out.println(ex.getMessage());
        }
     this.resposta.definirResposta("visao/agendames.jsp", Resposta.TipoResposta.encaminhamento);
    }
    
    @Seguranca(nivel = {NivelAcesso.ADMINISTRADOR,NivelAcesso.USUARIO})
    public void incluir() {
        this.resposta.adicionarAtributo("compromisso", new CompromissoMd(), Resposta.EscopoAtributo.requisicao);
        List<UsuarioMd> usuarios = daoUsuario.findUsuarioEntities();
        this.resposta.adicionarAtributo("usuarios", usuarios, Resposta.EscopoAtributo.requisicao);
        this.resposta.definirResposta("visao/compromissoCadastro.jsp", Resposta.TipoResposta.encaminhamento);
    }
}
